From: Aravindh Puthiyaparambil Date: Fri, 27 Apr 2012 15:54:00 +0000 (+0200) Subject: x86/hvm: Add get_shadow_gs_base() wrapper function X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=7febbdae3bda9ccca27870c3396850c3fb45f728;p=xen.git x86/hvm: Add get_shadow_gs_base() wrapper function Add a wrapper function to the HVM function table that returns the shadow GS base. Signed-off-by: Aravindh Puthiyaparambil Committed-by: Jan Beulich --- diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 6b7b653c21..47fe9846fe 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -645,6 +645,11 @@ static void svm_set_segment_register(struct vcpu *v, enum x86_segment seg, svm_vmload(vmcb); } +static unsigned long svm_get_shadow_gs_base(struct vcpu *v) +{ + return v->arch.hvm_svm.vmcb->kerngsbase; +} + static int svm_set_guest_pat(struct vcpu *v, u64 gpat) { struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb; @@ -1990,6 +1995,7 @@ static struct hvm_function_table __read_mostly svm_function_table = { .guest_x86_mode = svm_guest_x86_mode, .get_segment_register = svm_get_segment_register, .set_segment_register = svm_set_segment_register, + .get_shadow_gs_base = svm_get_shadow_gs_base, .update_host_cr3 = svm_update_host_cr3, .update_guest_cr = svm_update_guest_cr, .update_guest_efer = svm_update_guest_efer, diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index de945ce05c..a73350b112 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -942,6 +942,15 @@ static void vmx_set_segment_register(struct vcpu *v, enum x86_segment seg, vmx_vmcs_exit(v); } +static unsigned long vmx_get_shadow_gs_base(struct vcpu *v) +{ +#ifdef __x86_64__ + return v->arch.hvm_vmx.shadow_gs; +#else + return 0; +#endif +} + static int vmx_set_guest_pat(struct vcpu *v, u64 gpat) { if ( !cpu_has_vmx_pat || !paging_mode_hap(v->domain) ) @@ -1522,6 +1531,7 @@ static struct hvm_function_table __read_mostly vmx_function_table = { .guest_x86_mode = vmx_guest_x86_mode, .get_segment_register = vmx_get_segment_register, .set_segment_register = vmx_set_segment_register, + .get_shadow_gs_base = vmx_get_shadow_gs_base, .update_host_cr3 = vmx_update_host_cr3, .update_guest_cr = vmx_update_guest_cr, .update_guest_efer = vmx_update_guest_efer, diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h index 9b0e412ac1..c34b9535cb 100644 --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -106,6 +106,7 @@ struct hvm_function_table { struct segment_register *reg); void (*set_segment_register)(struct vcpu *v, enum x86_segment seg, struct segment_register *reg); + unsigned long (*get_shadow_gs_base)(struct vcpu *v); /* * Re-set the value of CR3 that Xen runs on when handling VM exits. @@ -305,6 +306,11 @@ hvm_set_segment_register(struct vcpu *v, enum x86_segment seg, hvm_funcs.set_segment_register(v, seg, reg); } +static inline unsigned long hvm_get_shadow_gs_base(struct vcpu *v) +{ + return hvm_funcs.get_shadow_gs_base(v); +} + #define is_viridian_domain(_d) \ (is_hvm_domain(_d) && ((_d)->arch.hvm_domain.params[HVM_PARAM_VIRIDIAN]))